package com.taijihuabao.modules.controller;

import com.github.pagehelper.PageInfo;
import com.taijihuabao.common.exception.ServiceException;
import com.taijihuabao.common.jsonresult.ApplicationResponseCode;
import com.taijihuabao.common.jsonresult.JsonResult;
import com.taijihuabao.common.redisconfig.UserLoad;
import com.taijihuabao.modules.entity.DeptRoleEntity;
import com.taijihuabao.modules.entity.DeptUserEntity;
import com.taijihuabao.modules.entity.UserEntity;
import com.taijihuabao.modules.enums.optenums.dept.DeptEnum;
import com.taijihuabao.modules.model.dept.role.DeptRoleCodeDTO;
import com.taijihuabao.modules.model.dept.role.DeptRoleDTO;
import com.taijihuabao.modules.model.dept.role.DeptRolePageDTO;
import com.taijihuabao.modules.service.DeptRoleService;
import com.taijihuabao.modules.service.DeptUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

/**
 * 部门角色管理
 * @author Xiao
 */
@Api(tags = "部门角色管理")
@RestController
@RequestMapping("/api/v1/dept/role")
public class DeptRoleController {

    @Autowired
    private DeptRoleService deptRoleService;
    @Autowired
    private DeptUserService deptUserService;

    /**
     * 获取部门角色列表(带分页)
     * @param deptRoleDTO
     * @return
     */
    @ApiOperation("获取部门角色列表(带分页)")
    @GetMapping
    public JsonResult selectAllDept(DeptRolePageDTO deptRoleDTO) {
        PageInfo pageInfo = deptRoleService.selectAllDept(deptRoleDTO);
        return JsonResult.success(pageInfo);
    }

    /**
     * 查询可以赋给部门的所有角色
     * @return
     */
    @ApiOperation("查询可以赋给部门的所有角色")
    @GetMapping("/allRole")
    public JsonResult selectAllRole() {
        return JsonResult.success(deptRoleService.selectAllRole());
    }

    /**
     * 新增可以赋给部门的所有角色
     * @return
     */
    @ApiOperation("新增可以赋给部门的所有角色")
    @PostMapping("/allRole")
    public JsonResult insertRoleCode(@RequestBody DeptRoleCodeDTO deptRoleCodeDTO) {
        deptRoleService.insertRoleCode(deptRoleCodeDTO);
        return JsonResult.success();
    }

    /**
     * 修改可以赋给部门的所有角色
     * @return
     */
    @ApiOperation("修改可以赋给部门的所有角色")
    @PutMapping("/allRole")
    public JsonResult updateRoleCode(@RequestBody DeptRoleCodeDTO deptRoleCodeDTO) {
        deptRoleService.updateRoleCode(deptRoleCodeDTO);
        return JsonResult.success();
    }

    /**
     * 获取所有部门角色信息
     * @return
     */
    @ApiOperation("获取所有部门角色信息")
    @GetMapping("/seletor")
    public JsonResult selectDepts() {
        List<DeptRoleEntity> data = deptRoleService.selectDepts();
        return JsonResult.success(data);
    }

    /**
     * 通过部门角色编码获取部门角色信息
     * @param deptRoleDTO
     * @return
     */
    @ApiOperation("通过部门角色编码获取部门角色信息")
    @GetMapping("/code")
    public JsonResult selectDeptByDeptRole(DeptRolePageDTO deptRoleDTO) {
        List<DeptRoleEntity> data = deptRoleService.selectDeptByCode(deptRoleDTO.getDeptRole());
        return JsonResult.success(data);
    }

    /**
     * 通过id获取部门角色信息
     * @param deptRoleDTO
     * @return
     */
    @ApiOperation("通过id获取部门角色信息")
    @GetMapping("/id")
    public JsonResult selectDeptById(DeptRolePageDTO deptRoleDTO) {
        DeptRoleEntity data = deptRoleService.selectDeptById(deptRoleDTO.getId());
        return JsonResult.success(data);
    }

    /**
     * 通过部门编码获取信息
     * @param deptRoleDTO
     * @return
     */
    @ApiOperation("通过部门编码获取部门角色信息")
    @GetMapping("/deptCode")
    public JsonResult selectDeptByUserId(DeptRolePageDTO deptRoleDTO) {
        List<DeptRoleEntity> data = deptRoleService.selectDeptByDeptCode(deptRoleDTO.getDeptCode());
        return JsonResult.success(data);
    }

    /**
     * 新增部门角色信息
     * @param deptRoleEntity
     * @return
     */
    @ApiOperation("新增部门角色信息可赋用户部门角色")
    @PostMapping
    public JsonResult insertDept(@RequestBody DeptRoleDTO deptRoleEntity) {
        UserEntity loginUser = UserLoad.getUser();
        //判断登录用户的身份
        deptJurisdiction(loginUser);
        deptRoleService.insertDept(deptRoleEntity);
        return JsonResult.success(deptRoleEntity);
    }

    /**
     * 部门角色信息编辑
     *
     * @param deptRoleEntity
     * @return
     */
    @ApiOperation("部门角色信息编辑")
    @PutMapping
    public JsonResult updateDept(@RequestBody DeptRoleDTO deptRoleEntity) {
        UserEntity loginUser = UserLoad.getUser();
        //判断登录用户的身份
        deptJurisdiction(loginUser);
        deptRoleService.updateDept(deptRoleEntity);
        return JsonResult.success(deptRoleEntity);
    }

    /**
     * 删除部门角色信息
     *
     * @param deptRoleEntity
     * @return
     */
    @ApiOperation("删除部门角色信息")
    @DeleteMapping
    public JsonResult deleteDept(@RequestBody DeptRoleDTO deptRoleEntity) {
        UserEntity loginUser = UserLoad.getUser();
        //判断登录用户的身份
        deptJurisdiction(loginUser);
        deptRoleService.deleteDept(deptRoleEntity);
        return JsonResult.success(deptRoleEntity.getId());
    }

    /**
     * 判断登录用户的权限是否能够更改部门表
     */
    private void deptJurisdiction(UserEntity loginUser){
        List<DeptUserEntity> list =  deptUserService.selectDeptByUserId(loginUser.getId());
        DeptUserEntity d1 = new DeptUserEntity();
        for(DeptUserEntity deptUserEntity : list){
            //判断是否为总经理办公室
            if (DeptEnum.GENERALMANAGER.getCode().equals(deptUserEntity.getDeptCode())) {
                d1 = deptUserEntity;
                break;
            }
        }
        if(Objects.isNull(d1.getUserId())){
            throw new ServiceException(ApplicationResponseCode.DEPT_OUT_BOUNDS);
        }
    }
}
